package chapter2.src.com.kkb.array;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;

/**
 * @author : wushikai
 * <p>
 * date : 2021-03-03
 */
public class ArraysDemo {



    public  static  String [] getStrArray ( ){


        String[] str = {"a","b","c" , "d", "e", "f", null , null , null, null };

        return str;

    }



    public  static <T> void printArray (T[] t ){

        for (int i = 0; i < t.length; i++) {
            System.out.println(
                    t[i]
            );
        }

    }

    public static void demo1(){

        String[] str = {"a","b","c"};
        List<String> strings = Arrays.asList(str);
        strings.add("a");
        // strings 的类型是  Arrays$ArrayList  而从 cglib 代理的是  OtherClass$$EnhancerByCGLIB$$ebef5aab

        Object o = Objects.requireNonNull(strings, "can not  be null");
        System.out.println(o);

    }





    public static void testSystemCopy(){
        int[] arr = {1,2,3,4,5};

        int[] copied = new int[10];

        System.out.println(Arrays.toString(copied));

        System.arraycopy(arr, 0, copied, 1, 5);// arr 原始数组, 0 , 原始数组的下标  1是目标数组开始的下标 ,   5是复制的长度

        System.out.println(Arrays.toString(copied)); //[0, 1, 2, 3, 4, 5, 0, 0, 0, 0]

    }


    /**
     *
     *  System.arrayCopy 只复制已有的数组, 并不会返回
     *
     * 区别是Arrays.copyOf（） 创建一个新数组, 然后使用 System.arrayCopy（）  复制数组元素, 最后返回
     *
     *
     * */
    public static void testArraysCopy(){

        int[] arr = {1,2,3,4,5};
        int[] copied = Arrays.copyOf(arr, 10); //10是新数组的长度, 容量够大 则 复制 全部
        int[] copied2 = Arrays.copyOf(arr, 1); //1是新数组的长度 , 容量不够 则 复制 一部分

        System.out.println(Arrays.toString(copied));
        System.out.println(Arrays.toString(copied2));

        copied = Arrays.copyOf(arr, 3);

        System.out.println(Arrays.toString(copied));


    }


    public static void testSystemCopy2(){

        Person[] persons = {new Person(), new Person(), new Person()};
        Person[] copy = new Person[6];
        System.arraycopy(persons, 0, copy, 1, 3);
        for (Person person : copy) {
            if (person!=null ){

                System.out.println(person.hashCode());
            }else {
                System.out.println("null");
            }
        }



    }

    /**
     * 自己复制自己
     * */
    public  static void testCopySelf ( ){
        System.out.println("----------------- testCopySelf ------------------");
        String[] strArray = getStrArray();
        printArray(strArray);
        System.out.println("__________");  //把 index 为 2 的 c 去掉
        System.arraycopy(strArray, 3, strArray, 2, 7);  //使用数组复制可以实现 去掉 某个 数组元素;
        printArray(strArray);

    }




    public static void main(String[] args){

        testSystemCopy();
        testArraysCopy();
        testSystemCopy2();
        testCopySelf();
    }



}
